home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / ashe-1.1 / xstyles.c < prev    next >
C/C++ Source or Header  |  1995-05-15  |  14KB  |  510 lines

  1. /** xstyles.c - (c) 1994 Copyright by John R. Punin
  2.  *
  3.  * ASHE
  4.  * 
  5.  * This file has the routines to implement the items in the
  6.  * 
  7.  * Menus Styles and Lists
  8.  * 
  9.  * John R. Punin      April -30 - 1994
  10.  *
  11. */
  12. #include "xhtml.h"
  13. #include "xfile.h"
  14. #include "xheader.h"
  15. #include "xmarkup.h"
  16. #include "xstyles.h"
  17.  
  18. /*
  19.    
  20.    NAME : routines_styles
  21.    PARAMETERS : int item_no
  22.                 Item number of the menu Styles
  23.    RETURN : void
  24.    DESCRIPTION :This is a Callback function that is called when
  25.                 one of the items of the Styles menu is selected.
  26.         This function creates a Dialog Window to be 
  27.         used for all items. Each item change the label
  28.         of the dialog widget
  29.  
  30. */
  31.  
  32. void 
  33. routines_styles(Widget w, int item_no, XtPointer call_data)
  34. {
  35.    Widget dialog;
  36.    XmString mstring,u,t;
  37.    enum commands command;
  38.    char *mstr;
  39.    HTMLED *he;
  40.    Widget parent = XtParent(w);
  41.  
  42.    XtVaGetValues(parent,XmNuserData,&he,NULL);
  43.  
  44.    if(strcmp(XtName(parent),"menu_doc"))
  45.       t = Initial_text(item_no,&command);
  46.    else
  47.       t = Initial_text(item_no+10,&command);
  48.  
  49.    he->user_data = (XtPointer)command;
  50.    mstr = XmTextGetSelection(he->textarea);
  51.    if(mstr)
  52.    {
  53.       dialog = XmCreatePromptDialog(he->textarea,"notice_header",NULL,0);
  54.       mstring = XmStringCreateLtoR(mstr,XmSTRING_DEFAULT_CHARSET);
  55.       u = XmStringConcat(t,mstring);
  56.       
  57.       XmStringFree(mstring);XmStringFree(t);
  58.       XtVaSetValues(dialog,
  59.             XmNselectionLabelString,u,NULL);
  60.       XmStringFree(u);
  61.       /* When the user choose a size of the header, call set_header */
  62.  
  63.       XtAddCallback(dialog, XmNokCallback,
  64.             (XtCallbackProc)set_style,(XtPointer)he);
  65.       
  66.       /* If the user selects cancel, just destroy the header dialog */
  67.       XtAddCallback(dialog, XmNcancelCallback,
  68.             (XtCallbackProc)XtDestroyWidget,NULL);
  69.       
  70.       /* Nor help neither text is available.... */
  71.       XtUnmanageChild(XmSelectionBoxGetChild(dialog,XmDIALOG_HELP_BUTTON));
  72.       XtUnmanageChild(XmSelectionBoxGetChild(dialog,XmDIALOG_TEXT));
  73.       XtManageChild(dialog);
  74.       XWarpPointer(XtDisplay(he->textarea),XtWindow(he->textarea),
  75.            XtWindow(dialog),
  76.                    0,0,800,800,20,20);
  77.    }
  78.    else
  79.       set_style(w,(XtPointer)he,NULL);
  80. }
  81. /*
  82.    
  83.    NAME : set_style
  84.    PARAMETERS : enum commands command
  85.                 Code of the command that is executed
  86.    RETURN : void
  87.    DESCRIPTION :This is a Callback function that is called when
  88.                 the Ok button is selected in the style Dialog
  89.         widget. Depending of the command the correspondent
  90.         tags are inserted in the selected text.
  91.  
  92. */
  93. void 
  94. set_style(Widget w, XtPointer client_data,XtPointer unused)
  95. {
  96.    HTMLED *he = (HTMLED *)client_data;
  97.    enum commands command = (enum commands)he->user_data;
  98.    char *strleft,*stright;
  99.    XmTextPosition left=0,right=0;
  100.    int len=0;
  101.    strleft = XtMalloc(20);
  102.    stright = XtMalloc(20);
  103.    Command_text(command,strleft,stright);
  104.    he->last_command = command;
  105.  
  106.    if(XmTextGetSelectionPosition(he->textarea,&left,&right))
  107.    {
  108.       if(right<=left)
  109.      left = right = XmTextGetInsertionPosition(he->textarea);
  110.    }
  111.    else
  112.       left = right = XmTextGetInsertionPosition(he->textarea);
  113.    if(left!=right)
  114.       len = right - left;
  115.    
  116.    XmTextInsert(he->textarea,right,stright);
  117.    XmTextInsert(he->textarea,left,strleft);
  118.    if(len==0)
  119.       len += strlen(strleft);
  120.    else
  121.       len += strlen(strleft)+strlen(stright);
  122.    XmTextSetInsertionPosition(he->textarea,left+len);
  123.    ChangeInsertionpoint(command,left,he);
  124.    XmProcessTraversal(he->textarea,XmTRAVERSE_CURRENT); 
  125. }
  126. void 
  127. ChangeInsertionpoint(enum commands command,XmTextPosition left,HTMLED *he)
  128. {
  129.    switch(command)
  130.    {
  131.    case ORLIST:
  132.    case UNLIST:
  133.       XmTextSetInsertionPosition(he->textarea,left+10);
  134.       break;
  135.    default:
  136.       break;
  137.       
  138.    }
  139. }
  140.  
  141. /*
  142.    
  143.    NAME : Command_text
  144.    PARAMETERS : enum commands command
  145.                 Command to be executed
  146.                 char *sl
  147.         Left Tag
  148.         char *sr
  149.         Right Tag
  150.    RETURN : void
  151.    DESCRIPTION :This function set the left and right tags
  152.                 depending of the command
  153.  
  154. */
  155. void 
  156. Command_text(enum commands command,char *sl,char *sr)
  157. {
  158.    switch(command)
  159.    {
  160.    case EM:
  161.       strcpy(sl,"<EM>");
  162.       strcpy(sr,"</EM>");
  163.       break;
  164.    case STRONG:
  165.       strcpy(sl,"<STRONG>");
  166.       strcpy(sr,"</STRONG>");
  167.       break;
  168.    case CODE:
  169.       strcpy(sl,"<CODE>");
  170.       strcpy(sr,"</CODE>");
  171.       break;
  172.    case CITE:
  173.       strcpy(sl,"<CITE>");
  174.       strcpy(sr,"</CITE>");
  175.       break;
  176.    case BLOCKQ:
  177.       strcpy(sl,"\n<BLOCKQUOTE>\n");
  178.       strcpy(sr,"\n</BLOCKQUOTE>\n");
  179.       break;
  180.    case ADDR:
  181.       strcpy(sl,"<ADDRESS>");
  182.       strcpy(sr,"</ADDRESS>");
  183.       break;
  184.    case BOLD:
  185.       strcpy(sl,"<B>");
  186.       strcpy(sr,"</B>");
  187.       break;
  188.    case ITALIC:
  189.       strcpy(sl,"<I>");
  190.       strcpy(sr,"</I>");
  191.       break;
  192.    case UNDER:
  193.       strcpy(sl,"<U>");
  194.       strcpy(sr,"</U>");
  195.       break;
  196.    case TT:
  197.       strcpy(sl,"<TT>");
  198.       strcpy(sr,"</TT>");
  199.       break;
  200.  
  201.    case UNLIST:
  202.       strcpy(sl,"\n<UL>\n<LI>");
  203.       strcpy(sr,"\n</UL>\n");
  204.       break;
  205.    case ORLIST:
  206.       strcpy(sl,"\n<OL>\n<LI>");
  207.       strcpy(sr,"\n</OL>\n");
  208.       break;
  209.    case HTML:
  210.       strcpy(sl,"<HTML>\n");
  211.       strcpy(sr,"\n</HTML>\n");
  212.       break;
  213.    case HEAD:
  214.       strcpy(sl,"<HEAD>\n");
  215.       strcpy(sr,"\n</HEAD>");
  216.       break;
  217.    case BODY:
  218.       strcpy(sl,"<BODY>\n");
  219.       strcpy(sr,"\n</BODY>");
  220.       break;
  221.    default:
  222.       break;
  223.    }
  224. }
  225. /* Set the Label and the command of the Style Dialog Widget */
  226. XmString
  227. Initial_text(int item_no,enum commands *command)
  228. {
  229.    char str[50];
  230.    switch(item_no)
  231.    {
  232.    case 0:strcpy(str,"Emphasis Text is : \n"); *command = EM;break;
  233.    case 1:strcpy(str,"Strong Text is : \n"); *command = STRONG;break;
  234.    case 2:strcpy(str,"Code Text is : \n"); *command = CODE;break;
  235.    case 3:strcpy(str,"Cite Text is : \n"); *command = CITE;break;
  236.    case 4:strcpy(str,"Blockquote Text is : \n"); *command = BLOCKQ;break;
  237.    case 5:strcpy(str,"Address Text is : \n"); *command = ADDR;break;
  238.    case 6:strcpy(str,"Bold Text is : \n"); *command = BOLD;break;
  239.    case 7:strcpy(str,"Italic Text is : \n"); *command = ITALIC;break;
  240.    case 8:strcpy(str,"Underline Text is : \n"); *command = UNDER;break;
  241.    case 9:strcpy(str,"Typewriter Text is : \n"); *command = TT;break;
  242.       /* this is Document Submenu */
  243.    case 10:strcpy(str,"HTML Text is : \n"); *command = HTML;break;
  244.    case 11:strcpy(str,"Head Text is : \n"); *command = HEAD;break;
  245.    case 12:strcpy(str,"Body Text is : \n"); *command = BODY;break;
  246.    default: break;
  247.       
  248.  
  249.    }
  250.    return(XmStringCreateLtoR(str,XmSTRING_DEFAULT_CHARSET));
  251. }
  252. /* 
  253.    NAME : routines_list
  254.    PARAMETERS : int item_no
  255.                 Item number of the menu Lists
  256.    RETURN : void
  257.    DESCRIPTION :This is a Callback function that is called when
  258.                 one of the items of the Lists menu is selected.
  259. */
  260. void
  261. routines_lists(Widget w, int item_no, XtPointer call_data)
  262. {
  263.    HTMLED *he;
  264.    Widget parent = XtParent(w);
  265.  
  266.    XtVaGetValues(parent,XmNuserData,&he,NULL);
  267.    
  268.    switch(item_no)
  269.    {
  270.    case 0:
  271.       set_definition_list(w,he); break;
  272.    case 1:
  273.       set_definition_entry(w,he); break;
  274.    case 2:
  275.    case 3:
  276.       set_simple_list(w,item_no,he); break;
  277.    case 4:
  278.       set_simple_entry(w,he); break;
  279.    }
  280. }
  281.  
  282. /*
  283.    
  284.    NAME : set_definition_list
  285.    PARAMETERS : Widget w
  286.                 From what widget this function is called.
  287.    RETURN : void
  288.    DESCRIPTION : This function inserts the definition list
  289.                  where the insertion cursor is
  290.  
  291. */
  292.       
  293. void 
  294. set_definition_list(Widget w,HTMLED *he)
  295. {
  296.    XmTextPosition left;
  297.    he->last_command = DEFLIST;
  298.    left = XmTextGetInsertionPosition(he->textarea);
  299.    XmTextInsert(he->textarea,left,"\n<DL>\n<DT>\n<DD>\n</DL>\n");
  300.    XmTextSetInsertionPosition(he->textarea,left+10);
  301.    XmProcessTraversal(he->textarea,XmTRAVERSE_CURRENT); 
  302. }
  303. /*
  304.    
  305.    NAME : set_definition_entry
  306.    PARAMETERS : Widget w
  307.                 From what widget this function is called.
  308.    RETURN : void
  309.    DESCRIPTION : This function inserts the term of definition list
  310.                  where the insertion cursor is
  311.  
  312. */
  313. void 
  314. set_definition_entry(Widget w,HTMLED *he)
  315. {
  316.    XmTextPosition left;
  317.    he->last_command = TERM;
  318.    left = XmTextGetInsertionPosition(he->textarea);
  319.    XmTextInsert(he->textarea,left,"\n<DT>\n<DD>\n");
  320.    XmTextSetInsertionPosition(he->textarea,left+5);
  321.    XmProcessTraversal(he->textarea,XmTRAVERSE_CURRENT); 
  322.    
  323. }
  324. /*
  325.    
  326.    NAME : set_simple_list
  327.    PARAMETERS : Widget w
  328.                 From what widget this function is called.
  329.         int item_no
  330.         0 if it is ordered list or 1 if it is
  331.         unordered list
  332.    RETURN : void
  333.    DESCRIPTION : This function inserts a bulleted or numbered list
  334.                  where the insertion cursor is depending on item_no
  335.  
  336. */
  337. void 
  338. set_simple_list(Widget w,int item_no,HTMLED *he)
  339.    Widget dialog;
  340.    XmString mstring,u,t;
  341.    char *mstr;
  342.    enum commands command;
  343.    t = Initial_list(item_no,&command);
  344.    he->user_data = (XtPointer)command;
  345.    
  346.    mstr = XmTextGetSelection(he->textarea);
  347.    if(mstr)
  348.    {
  349.       dialog = XmCreatePromptDialog(he->textarea,"notice_header",NULL,0);
  350.       mstring = XmStringCreateLtoR(mstr,XmSTRING_DEFAULT_CHARSET);
  351.       u = XmStringConcat(t,mstring);
  352.       
  353.       XmStringFree(mstring);XmStringFree(t);
  354.       XtVaSetValues(dialog,
  355.             XmNselectionLabelString,u,NULL);
  356.       XmStringFree(u);
  357.       /* When the user choose a ordered_list, call set_type_list */
  358.  
  359.       XtAddCallback(dialog, XmNokCallback,(XtCallbackProc)set_style,(XtPointer)he);
  360.       
  361.       /* If the user selects cancel, just destroy the header dialog */
  362.       XtAddCallback(dialog, XmNcancelCallback,(XtCallbackProc)XtDestroyWidget,NULL);
  363.       
  364.       /* Nor help neither text is available.... */
  365.       XtUnmanageChild(XmSelectionBoxGetChild(dialog,XmDIALOG_HELP_BUTTON));
  366.       XtUnmanageChild(XmSelectionBoxGetChild(dialog,XmDIALOG_TEXT));
  367.       XtManageChild(dialog);
  368.       XWarpPointer(XtDisplay(he->textarea),XtWindow(he->textarea),
  369.            XtWindow(dialog),
  370.                    0,0,800,800,20,20);
  371.    }
  372.    else
  373.       set_style(w,(XtPointer)he,NULL);
  374.  
  375. }
  376. /*
  377.    
  378.    NAME : Initial_list
  379.    PARAMETERS : int item_no,
  380.                 Bulleted or Numbered list
  381.                 enum commands *command
  382.                 command to be executed
  383.    RETURN : void
  384.    DESCRIPTION : This function set the name of the 
  385.                  label in the list Dialog widget. It
  386.          takes the selected text as a first item
  387. */
  388. XmString
  389. Initial_list(int item_no,enum commands *command)
  390. {
  391.    char str[50];
  392.    if(item_no == 2)
  393.    {
  394.       *command = UNLIST;
  395.       strcpy(str,"Unordered list is :\n\nFirst Item :\n\t");
  396.    }
  397.    else if(item_no==3)
  398.    {
  399.       *command = ORLIST;
  400.       strcpy(str,"Ordered list is :\n\nFirst Item :\n\t");
  401.    }
  402.    return(XmStringCreateLtoR(str,XmSTRING_DEFAULT_CHARSET));
  403. }
  404. /*
  405.    
  406.    NAME : set_simple_entry
  407.    PARAMETERS : Widget w
  408.                 From what widget this function is called.
  409.    RETURN : void
  410.    DESCRIPTION : This function inserts the labeled item list
  411.                  where the insertion cursor is
  412.  
  413. */
  414. void 
  415. set_simple_entry(Widget w,HTMLED *he)
  416. {
  417.    XmTextPosition left = XmTextGetInsertionPosition(he->textarea);
  418.    he->last_command = ITEM;
  419.    XmTextInsert(he->textarea,left,"\n<LI>");
  420.    XmTextSetInsertionPosition(he->textarea,left+5);
  421.    XmProcessTraversal(he->textarea,XmTRAVERSE_CURRENT); 
  422. }
  423.  
  424. /********************************************************************
  425.    This routines to help you to add HTML characters items to 
  426.    the menu characters.
  427.  
  428.    Feel Free to add any special characters that you like it.
  429.  
  430.    Please, see the binding keys before you add any binding keys for
  431.    characters.
  432.  
  433.    For more information about HTML characters, see the help menu
  434.    on characters. 
  435.  
  436. *********************************************************************/
  437. void 
  438. BuildCharactersMenu(Widget menubar, HTMLED *he)
  439. {
  440.    /* Sixth menu is the Characters menu */
  441.    XmString less_than = XmStringCreateSimple("Less than");
  442.    XmString less_than_acc = XmStringCreateSimple("Ctrl-L");
  443.    XmString greater_than= XmStringCreateSimple("Greater than");
  444.    XmString greater_than_acc = XmStringCreateSimple("Ctrl-G");
  445.    XmString ampersand = XmStringCreateSimple("Ampersand");
  446.    XmString ampersand_acc = XmStringCreateSimple("Ctrl-&");
  447.    XmString quote = XmStringCreateSimple("Quote");
  448.    XmString quote_acc = XmStringCreateSimple("Ctrl-Q");
  449.  
  450.    /* Add new XmString characters and new acc for characters */
  451.  
  452.  
  453.    XmVaCreateSimplePulldownMenu(menubar,"characters_menu",5,
  454.                 (XtCallbackProc)routines_carac,
  455.        XmVaPUSHBUTTON, less_than, '\0', "Ctrl Shift<Key> l",less_than_acc,
  456.     XmVaPUSHBUTTON, greater_than, '\0', "Ctrl Shift <Key> g",greater_than_acc,
  457.       XmVaPUSHBUTTON, ampersand, '\0', "Ctrl Shift <Key> 7",ampersand_acc,
  458.            XmVaPUSHBUTTON, quote, '\0',"Ctrl Shift <Key> q",quote_acc,
  459.            XmNuserData,he,
  460.        NULL);
  461.  
  462.    /* Make sure to free the XmStrings */
  463.    XmStringFree(quote);XmStringFree(quote_acc);
  464.    XmStringFree(ampersand);XmStringFree(ampersand_acc);
  465.    XmStringFree(less_than); XmStringFree(less_than_acc);
  466.    XmStringFree(greater_than); XmStringFree(greater_than_acc);
  467.    
  468. }
  469.  
  470. /* Please, do not modify this routine */
  471. void 
  472. routines_carac(Widget w, int item_no, XtPointer call_data)
  473. {
  474.    XmTextPosition pos;  
  475.    HTMLED *he;
  476.    String carac = get_character(item_no);
  477.    Widget parent = XtParent(w);
  478.  
  479.    XtVaGetValues(parent,XmNuserData,&he,NULL);
  480.  
  481.    pos = XmTextGetInsertionPosition(he->textarea);
  482.    he->last_command = CARAC;
  483.    
  484.    XmTextInsert(he->textarea,pos,carac);
  485.    XmTextSetInsertionPosition(he->textarea,pos + strlen(carac)); 
  486.    XmProcessTraversal(he->textarea,XmTRAVERSE_CURRENT);
  487.    XtFree(carac);
  488. }
  489.  
  490. char *
  491. get_character(int item_no)
  492. {
  493.    String carac = XtMalloc(20);
  494.  
  495.    switch(item_no)
  496.    {
  497.    case 0:
  498.       strcpy(carac,"<"); break;
  499.    case 1:
  500.       strcpy(carac,">"); break;
  501.    case 2:
  502.       strcpy(carac,"&"); break;
  503.    case 3:
  504.       strcpy(carac,"""); break;
  505.       /* Add new cases for new HTML characters */
  506.    }
  507.    return(carac);
  508. }
  509.